/*
 * Key.h
 *
 *  Created on: Jun 7, 2024
 *      Author: Liangmiyi
 */

#ifndef MY_INC_PHY_PHY_PRINT_H_
#define MY_INC_PHY_PHY_PRINT_H_
#include <usart.h>
#include <stdio.h>
#include <stdbool.h>
#include <stdarg.h>
#include <string.h>
#include <main.h>
#include <stdint.h>

#define MAX_SIZE 256
#define BUF_SIZE 256

// DMA缓冲区管理结构
typedef struct
{
    volatile uint16_t read_index;  // 读指针位置
    volatile uint16_t write_index; // 写指针位置（由DMA更新）
} UART_DMA_BufferTypeDef;

// 添加发送队列结构
#define TX_QUEUE_SIZE 8 // 发送队列大小

typedef struct
{
    char buffer[MAX_SIZE];
    uint16_t length;
} TxMessage;

typedef struct
{
    TxMessage messages[TX_QUEUE_SIZE];
    uint8_t head;
    uint8_t tail;
    uint8_t count;
} TxQueue;

// 声明发送状态标志
extern volatile uint8_t uart1_is_sending;
extern volatile uint8_t uart2_is_sending;

// 函数声明
void Uart1_Init(void);
void Uart2_Init(void);

void UART1_DMA_Send(uint8_t *str, uint16_t size);
void UART2_DMA_Send(uint8_t *str, uint16_t size);
int Uart1_Printf(const char *fmt, ...);
int Uart2_Printf(const char *fmt, ...);

// 串口数据处理函数
void UART1_ProcessData(void);
void UART2_ProcessData(void);

// 获取可读数据大小
uint16_t UART_GetRxDataSize(const UART_DMA_BufferTypeDef *dma_buffer);

// 从环形缓冲区读取数据
uint16_t UART_ReadData(UART_DMA_BufferTypeDef *dma_buffer, uint8_t *buffer, uint16_t max_size);

// 打印接收到的数据（用于调试）
void UART1_PrintReceivedData(void);
void UART2_PrintReceivedData(void);

#endif /* __PHY_PRINT_H__ */
